struct xdg_popup *xdg_popup;
struct gtk_surface *gtk_surface;
+ struct wl_subsurface *subsurface;
+
unsigned int mapped : 1;
unsigned int use_custom_surface : 1;
unsigned int pending_commit : 1;
surface_leave
};
+static void
+gdk_wayland_window_create_subsurface (GdkWindow *window)
+{
+ GdkWindowImplWayland *impl, *parent_impl = NULL;
+ GdkWaylandDisplay *display_wayland;
+
+ if (GDK_WINDOW_TYPE (window) != GDK_WINDOW_SUBSURFACE)
+ return;
+
+ impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
+
+ if (!impl->surface)
+ return; /* Bail out, surface and subsurface will be created later when shown */
+
+ if (impl->subsurface)
+ return;
+
+ if (impl->transient_for)
+ parent_impl = GDK_WINDOW_IMPL_WAYLAND (impl->transient_for->impl);
+
+ if (parent_impl)
+ {
+ display_wayland = GDK_WAYLAND_DISPLAY (gdk_window_get_display (window));
+ impl->subsurface =
+ wl_subcompositor_get_subsurface (display_wayland->subcompositor,
+ impl->surface, parent_impl->surface);
+ wl_subsurface_set_position (impl->subsurface, window->x, window->y);
+ wl_subsurface_set_desync (impl->subsurface);
+ }
+}
+
static void
gdk_wayland_window_create_surface (GdkWindow *window)
{
gdk_wayland_window_sync_opaque_region (window);
gdk_wayland_window_sync_input_region (window);
+
+ if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_SUBSURFACE)
+ gdk_wayland_window_create_subsurface (window);
}
static void
else
transient_for = impl->transient_for;
- if (transient_for)
+ if (transient_for &&
+ GDK_WINDOW_TYPE (window) != GDK_WINDOW_SUBSURFACE)
{
struct wl_seat *grab_input_seat = find_grab_input_seat (window, transient_for);
if (grab_input_seat &&
}
}
- gdk_wayland_window_create_xdg_surface (window);
+ if (GDK_WINDOW_TYPE (window) != GDK_WINDOW_SUBSURFACE)
+ gdk_wayland_window_create_xdg_surface (window);
mapped:
impl->mapped = TRUE;
if (!impl->surface)
gdk_wayland_window_create_surface (window);
+ if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_SUBSURFACE)
+ gdk_wayland_window_create_subsurface (window);
+
gdk_wayland_window_map (window);
_gdk_make_event (window, GDK_MAP, NULL, FALSE);
impl->xdg_popup = NULL;
}
+ if (impl->subsurface)
+ {
+ wl_subsurface_destroy (impl->subsurface);
+ impl->subsurface = NULL;
+ }
+
wl_surface_destroy (impl->surface);
impl->surface = NULL;
{
if (with_move)
{
+ GdkWindowImplWayland *impl;
+
+ impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
+
/* Each toplevel has in its own "root" coordinate system */
if (GDK_WINDOW_TYPE (window) != GDK_WINDOW_TOPLEVEL)
{
window->x = x;
window->y = y;
+
+ if (impl->subsurface)
+ wl_subsurface_set_position (impl->subsurface, x, y);
}
}
impl->transient_for = parent;
gdk_wayland_window_sync_parent (window);
+
+ if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_SUBSURFACE)
+ {
+ if (impl->subsurface)
+ {
+ wl_subsurface_destroy (impl->subsurface);
+ impl->subsurface = NULL;
+ }
+
+ if (parent)
+ gdk_wayland_window_create_subsurface (window);
+ }
}
static void